//导入express
const express = require('express')
const cors = require('cors');
const bodyParser = require('body-parser');
//登录验证
const jwt = require("jsonwebtoken");
const { expressjwt } = require("express-jwt");
// 导入 path 和 fs 模块
const path = require('path');
const fs = require('fs');
const zlib = require('zlib');
//引入中间件
// const multer = require('multer');
//创建web服务器
const app=express()
//socket.io
const http = require('http');
const socketIo = require('socket.io');
const server = http.createServer(app);
const io = socketIo(server,{
  cors: {
      origin: '*'
  }
});

const socket=require('./util/socket')
socket(io)

//解析请求中的json数据
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 启用 CORS
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//简易随机生成
const secretKey = 'weiyinglin';

const usersRouter = require('./routers/users');
const articleRouter = require('./routers/article');
const othersRouter=require('./routers/others');
const bookingRouter=require('./routers/booking');
const adminRouter=require('./routers/admin');
const consultRouter=require('./routers/consult')
const consultantRouter=require('./routers/consultant')
// TODO_04：注册将 JWT 字符串解析还原成 JSON 对象的中间件
// 注意：只要配置成功了 express-jwt 这个中间件，就可以把解析出来的用户信息，挂载到 req.user 属性上
app.use(
    expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({
        path: [/^\/users\//, /^\/images\//], // 添加请求图片的路由路径
    })
  );

app.get('/test',(req,res)=>{
    
    console.log('111')
    return res.status(201).json({message:'测试成功'})
})
  
// 处理图片请求
app.post('/images', (req, res) => {
    // console.log('我在这')
    // console.log(req.body)
    const filename = req.body.pic
    // 压缩数据
   function compressData(data) {
    return zlib.gzipSync(data);
  }
  
  // 解压缩数据
  function decompressData(data) {
    return zlib.gunzipSync(data);
  }
    // console.log(filename)
    const imagePath = path.join(__dirname,  filename);  // 图片的实际存储路径
    // console.log(imagePath)
    // 检查文件是否存在
    if (fs.existsSync(imagePath)) {
        // // 读取文件并将其转换为Base64格式
        const imageBuffer = fs.readFileSync(imagePath);
        const base64Image = Buffer.from(imageBuffer).toString('base64');
        // const compressedData = compressData(base64Image);
    //    const base64Data = compressedData.toString('base64')

       // 按固定大小分割 Base64 数据
       const chunkSize = 1024; // 每个分块的大小
       const totalChunks = Math.ceil(base64Image.length / chunkSize);
       const base64Chunks = [];
       for (let i = 0; i < totalChunks; i++) {
         const start = i * chunkSize;
         const end = start + chunkSize;
         const chunk = base64Image.substring(start, end);
         base64Chunks.push(chunk);
       }
      return  res.status(201).json({ totalChunks, base64Chunks })
    } else {
      res.status(404).send('图片不存在');
    }
  });
// 使用 usersRouter 处理 /users 路径的请求
app.use('/users', usersRouter);
// 使用 articleRouter 处理 /article 路径的请求
app.use('/article', articleRouter);
// 使用 othersRouter 处理 /others 路径的请求
app.use('/others', othersRouter);
// 使用 bookingRouter 处理 /booking 路径的请求
app.use('/booking',bookingRouter);
// 使用 adminRouter 处理 /admin路径的请求
app.use('/admin',adminRouter);
// 使用 consultRouter 处理 /consult路径的请求
app.use('/consult',consultRouter);
//使用consultantRouter处理/consultant路径的请求
app.use('/consultant',consultantRouter)

// TODO_06：使用全局错误处理中间件，捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {
    // 这次错误是由 token 解析失败导致的
    if (err.name === "UnauthorizedError") {
      return res.status(401).send({
        status: 401,
        message: "无效的token",
      });
    }
    res.status(500).send({
      status: 500,
      message: "未知的错误",
    });
  });


// 通过ap.listen进行服务器的配置，并启动服务器，接收两个配置参数，一个是对应的端口号，一个是启动成功的回调函数
server.listen(8888,()=>{
    console.log('express服务器启动成功');
})


